package com.eedi.framework.dict.dal.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.eedi.framework.dict.controller.sys.vo.data.SysDictDataResp;
import com.eedi.framework.common.enums.CommonStatusEnum;
import com.eedi.framework.common.pojo.PageResult;
import com.eedi.framework.common.util.object.BeanUtils;
import com.eedi.framework.mybatis.core.mapper.BaseMapperX;
import com.eedi.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.eedi.framework.dict.controller.sys.vo.data.SysDictDataPageReq;
import com.eedi.framework.dict.dal.dataobject.SysDictDataDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.*;
import java.util.stream.Collectors;

@Mapper
public interface SysDictDataMapper extends BaseMapperX<SysDictDataDO> {

    default SysDictDataDO selectByDictTypeAndValue(String sysDictType, String value) {
        return selectOne(SysDictDataDO::getSysDictType, sysDictType, SysDictDataDO::getSysDictValue, value);
    }

    default SysDictDataDO selectByDictTypeAndLabel(String dictType, String label) {
        return selectOne(SysDictDataDO::getSysDictType, dictType, SysDictDataDO::getSysDictLabel, label);
    }

    default List<SysDictDataDO> selectByDictTypeAndValues(String dictType, Collection<String> values) {
        return selectList(new LambdaQueryWrapper<SysDictDataDO>().eq(SysDictDataDO::getSysDictType, dictType)
                .in(SysDictDataDO::getSysDictValue, values));
    }

    default Map<String, List<SysDictDataResp>> getDictDataMap(Collection<String> dictType) {

        List<SysDictDataDO> sysDictData = selectList(SysDictDataDO::getSysDictType, dictType);
        List<SysDictDataResp> respList = BeanUtils.toBean(sysDictData, SysDictDataResp.class);

        return respList.stream().collect(Collectors.groupingBy(SysDictDataResp::getSysDictType));
    }

    default List<SysDictDataResp> getDictDataList(Collection<String> dictType) {

        List<SysDictDataDO> sysDictData = selectList(SysDictDataDO::getSysDictType, dictType);
        return BeanUtils.toBean(sysDictData, SysDictDataResp.class);
    }

    default long selectCountByDictType(String dictType) {
        return selectCount(SysDictDataDO::getSysDictType, dictType);
    }

    default PageResult<SysDictDataDO> selectPage(SysDictDataPageReq reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SysDictDataDO>()
                .likeIfPresent(SysDictDataDO::getSysDictLabel, reqVO.getSysDictLabel())
                .eqIfPresent(SysDictDataDO::getSysDictType, reqVO.getSysDictType())
                .eqIfPresent(SysDictDataDO::getSysDictDataStatus, reqVO.getSysDictDataStatus())
                .orderByDesc(Arrays.asList(SysDictDataDO::getSysDictDataSort, SysDictDataDO::getSysDictDataSort)));
    }

    default List<SysDictDataDO> selectListByStatusAndDictType(CommonStatusEnum status, String dictType) {
        return selectList(new LambdaQueryWrapperX<SysDictDataDO>()
                .eqIfPresent(SysDictDataDO::getSysDictDataStatus, status)
                .eqIfPresent(SysDictDataDO::getSysDictType, dictType));
    }

}
